package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import java.time.Duration;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 缓存服务接口
 * 提供统一的Redis缓存操作
 */
public interface ICacheService {
    /**
     * 设置缓存
     * @param key 键
     * @param value 值
     * @return 是否设置成功
     */
    Boolean set(String key, Object value);
    
    /**
     * 设置缓存（带过期时间）
     * @param key 键
     * @param value 值
     * @param timeout 过期时间
     * @param unit 时间单位
     * @return 是否设置成功
     */
    Boolean set(String key, Object value, long timeout, TimeUnit unit);
    
    /**
     * 设置缓存（带过期时间）
     * @param key 键
     * @param value 值
     * @param duration 过期时间
     */
    void set(String key, Object value, Duration duration);
    
    /**
     * 获取缓存
     * @param key 键
     * @return 值
     */
    Object get(String key);
    
    /**
     * 获取缓存（指定类型）
     * @param key 键
     * @param clazz 类型
     * @param <T> 泛型
     * @return 值
     */
    <T> T get(String key, Class<T> clazz);
    
    /**
     * 获取字符串缓存
     * @param key 键
     * @return 字符串值
     */
    String getString(String key);
    
    /**
     * 设置字符串缓存
     * @param key 键
     * @param value 值
     * @return 是否设置成功
     */
    Boolean setString(String key, String value);
    
    /**
     * 设置字符串缓存（带过期时间）
     * @param key 键
     * @param value 值
     * @param timeout 过期时间
     * @param unit 时间单位
     * @return 是否设置成功
     */
    Boolean setString(String key, String value, long timeout, TimeUnit unit);
    
    /**
     * 设置缓存（带过期时间，秒为单位）
     * @param key 键
     * @param value 值
     * @param seconds 过期时间（秒）
     * @return 是否设置成功
     */
    Boolean setEx(String key, Object value, long seconds);
    
    /**
     * 设置字符串缓存（带过期时间，秒为单位）
     * @param key 键
     * @param value 值
     * @param seconds 过期时间（秒）
     * @return 是否设置成功
     */
    Boolean setStringEx(String key, String value, long seconds);
    
    /**
     * 删除缓存
     * @param key 键
     * @return 是否删除成功
     */
    Boolean delete(String key);
    
    /**
     * 批量删除缓存
     * @param keys 键集合
     * @return 删除的数量
     */
    Long delete(Collection<String> keys);
    
    /**
     * 检查键是否存在
     * @param key 键
     * @return 是否存在
     */
    Boolean hasKey(String key);
    
    /**
     * 设置过期时间
     * @param key 键
     * @param timeout 过期时间
     * @param unit 时间单位
     * @return 是否设置成功
     */
    Boolean expire(String key, long timeout, TimeUnit unit);
    
    /**
     * 设置过期时间
     * @param key 键
     * @param timeout 过期时间
     * @return 是否设置成功
     */
    Boolean expire(String key, Duration timeout);
    
    /**
     * 获取过期时间
     * @param key 键
     * @return 过期时间（秒）
     */
    Long getExpire(String key);
    
    /**
     * 获取匹配的键
     * @param pattern 模式
     * @return 键集合
     */
    Set<String> keys(String pattern);
    /**
     * 设置Hash值
     * @param key 键
     * @param hashKey Hash键
     * @param value 值
     * @return 是否设置成功
     */
    Boolean hSet(String key, String hashKey, Object value);
    
    /**
     * 获取Hash值
     * @param key 键
     * @param hashKey Hash键
     * @return 值
     */
    Object hGet(String key, String hashKey);
    
    /**
     * 获取Hash值（指定类型）
     * @param key 键
     * @param hashKey Hash键
     * @param clazz 类型
     * @param <T> 泛型
     * @return 值
     */
    <T> T hGet(String key, String hashKey, Class<T> clazz);
    
    /**
     * 删除Hash值
     * @param key 键
     * @param hashKeys Hash键数组
     * @return 删除的数量
     */
    Long hDelete(String key, Object... hashKeys);
    
    /**
     * 检查Hash键是否存在
     * @param key 键
     * @param hashKey Hash键
     * @return 是否存在
     */
    Boolean hHasKey(String key, String hashKey);
    
    /**
     * 获取Hash的所有键值对
     * @param key 键
     * @return 键值对Map
     */
    Map<Object, Object> hGetAll(String key);
    
    /**
     * 获取Hash的所有键
     * @param key 键
     * @return 键集合
     */
    Set<Object> hKeys(String key);
    
    /**
     * 获取Hash的所有值
     * @param key 键
     * @return 值列表
     */
    List<Object> hValues(String key);
    
    /**
     * 获取Hash的大小
     * @param key 键
     * @return 大小
     */
    Long hSize(String key);
    
    /**
     * 批量设置Hash字段
     * @param key 键
     * @param map 字段值映射
     * @return 是否设置成功
     */
    Boolean hMSet(String key, Map<String, Object> map);
    
    /**
     * 批量设置Hash字段（别名方法）
     * @param key 键
     * @param map 字段值映射
     * @return 是否设置成功
     */
    Boolean hSetAll(String key, Map<String, Object> map);
    
    /**
     * 批量获取Hash字段
     * @param key 键
     * @param hashKeys Hash键集合
     * @return 值列表
     */
    List<Object> hMGet(String key, Collection<Object> hashKeys);
    
    /**
     * Hash字段递增
     * @param key 键
     * @param field 字段
     * @param delta 增量
     * @return 递增后的值
     */
    Long hIncr(String key, String field, long delta);
    
    /**
     * Hash字段递增
     * @param key 键
     * @param field 字段
     * @param delta 增量
     * @return 递增后的值
     */
    Long hIncr(String key, String field, int delta);
    /**
     * 从左侧推入List
     * @param key 键
     * @param value 值
     * @return List长度
     */
    Long lLeftPush(String key, Object value);
    
    /**
     * 左推入List
     * @param key 键
     * @param value 值
     * @return List长度
     */
    Long lPush(String key, Object value);
    
    /**
     * 从右侧推入List
     * @param key 键
     * @param value 值
     * @return List长度
     */
    Long lRightPush(String key, Object value);
    
    /**
     * 从右侧推入List（别名方法）
     * @param key 键
     * @param value 值
     * @return List长度
     */
    Long rPush(String key, Object value);
    
    /**
     * 从左侧弹出List
     * @param key 键
     * @return 值
     */
    Object lLeftPop(String key);
    
    /**
     * 从右侧弹出List
     * @param key 键
     * @return 值
     */
    Object lRightPop(String key);
    
    /**
     * 从右侧弹出List（别名方法）
     * @param key 键
     * @return 值
     */
    Object rPop(String key);
    
    /**
     * 获取List范围内的元素
     * @param key 键
     * @param start 开始索引
     * @param end 结束索引
     * @return 元素列表
     */
    List<Object> lRange(String key, long start, long end);
    
    /**
     * 获取List长度
     * @param key 键
     * @return 长度
     */
    Long lSize(String key);
    
    /**
     * 修剪List，保留指定范围内的元素
     * @param key 键
     * @param start 开始索引
     * @param end 结束索引
     */
    void lTrim(String key, long start, long end);
    /**
     * 添加Set元素
     * @param key 键
     * @param values 值数组
     * @return 添加的数量
     */
    Long sAdd(String key, Object... values);
    
    /**
     * 移除Set元素
     * @param key 键
     * @param values 值数组
     * @return 移除的数量
     */
    Long sRemove(String key, Object... values);
    
    /**
     * 检查Set是否包含元素
     * @param key 键
     * @param value 值
     * @return 是否包含
     */
    Boolean sIsMember(String key, Object value);
    
    /**
     * 获取Set的所有元素
     * @param key 键
     * @return 元素集合
     */
    Set<Object> sMembers(String key);
    
    /**
     * 获取Set的大小
     * @param key 键
     * @return 大小
     */
    Long sSize(String key);
    /**
     * 添加ZSet元素
     * @param key 键
     * @param value 值
     * @param score 分数
     * @return 是否添加成功
     */
    Boolean zAdd(String key, Object value, double score);
    
    /**
     * 移除ZSet元素
     * @param key 键
     * @param values 值数组
     * @return 移除的数量
     */
    Long zRemove(String key, Object... values);
    
    /**
     * 获取ZSet范围内的元素（按分数）
     * @param key 键
     * @param min 最小分数
     * @param max 最大分数
     * @return 元素集合
     */
    Set<Object> zRangeByScore(String key, double min, double max);
    
    /**
     * 获取ZSet范围内的元素（按排名）
     * @param key 键
     * @param start 开始排名
     * @param end 结束排名
     * @return 元素集合
     */
    Set<Object> zRange(String key, long start, long end);
    
    /**
     * 获取ZSet的大小
     * @param key 键
     * @return 大小
     */
    Long zSize(String key);
    
    /**
     * 获取元素的分数
     * @param key 键
     * @param value 值
     * @return 分数
     */
    Double zScore(String key, Object value);
    /**
     * 递增计数器
     * @param key 键
     * @return 递增后的值
     */
    Long increment(String key);
    
    /**
     * 递增计数器（指定步长）
     * @param key 键
     * @param delta 步长
     * @return 递增后的值
     */
    Long increment(String key, long delta);
    
    /**
     * 递减计数器
     * @param key 键
     * @return 递减后的值
     */
    Long decrement(String key);
    
    /**
     * 递减计数器（指定步长）
     * @param key 键
     * @param delta 步长
     * @return 递减后的值
     */
    Long decrement(String key, long delta);
    /**
     * 生成缓存键
     * @param prefix 前缀
     * @param suffix 后缀
     * @return 缓存键
     */
    String generateKey(String prefix, String suffix);
    
    /**
     * 清空所有缓存
     */
    void flushAll();
    
    /**
     * 获取缓存信息
     * @return 缓存信息
     */
    Map<String, Object> getCacheInfo();
    
    /**
     * 获取缓存信息（别名方法）
     * @return 缓存信息
     */
    Map<String, Object> getInfo();
    
    /**
     * 清理过期缓存
     */
    void cleanExpiredCache();
}
